设计模式(四)——11个行为模式

职责链模式(chain of responsibility pattern)

命令模式(command pattern)

解释器模式(interpreter pattern)

迭代器模式(iterator pattern)

中介者模式(mediator pattern)

备忘录模式(memento pattern)

观察者模式(observer pattern)—对象间的联动

观察者模式用于建立一种对象之间的依赖关系,一个对象发生改变时将通知其他对象,其他对象将相应作出反应。它广泛应用在图形化编程中。

定义

定义对象之间的一种依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并自动更新。观察者模式的别名包括:发布-订阅(publish-subscribe)模式、模型-视图(model-view)模式、源-监听(source-listener)模式、从属者(dependents)模式。

观察者模式的4个角色(类)

(1)Subject(目标)
它是被观察的对象。一个目标可以定义任意多个观察者来观察者,它定义了一系列方法来增加attach()和删除detach()观察者对象,同时定义了通知方法notify()。目标类可以是接口、抽象类或具体类。
(2)ConcreteSubject(具体目标)
具体目标是目标类的子类,它实现了目标类中的抽象方法;通常它包含要经常改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。如无需扩展目标类,则具体目标类可以省略。
(3)Observer(观察者)
观察者将对目标的改变做出反应。观察者一般定义为接口,因此又称为抽象观察者,这个接口声明了更新数据的方法update()。
(4)ConcreteObserver(具体观察者)
在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要与目标的状态保持一致;它实现了抽象观察者中定义的update()方法。

实现观察者模式

实现观察者模式比较直观的一种是使用“注册、通知、撤销注册”的形式:
(1)注册
观察者将自己注册到目标对象中,目标对象将观察者放在一个容器里。为防止观察者重复,一般用HashSet来保存观察者的引用(Set集合无序、不重复)。
(2)通知
目标对象发生了某种变化(如按钮被单击),从容器中得到所有注册过的观察者,经变化通知给观察者。
(3)撤销注册
观察者告诉目标要撤销观察,目标间观察者从容器中移除。所以观察者接口中需要有cancelObserve()方法,方法体中得到目标的容器,并去掉当前观察者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//目标
abstract class Subject{
//定义一个观察者集合用于存储所有观察者
protected HashSet<Observer> observers = new HashSet<>();
//向观察者集合中添加一个观察者
public void attach(Obsrever observer){
observers.add(observer);
}
//从观察者集合中删除一个观察者
public void detach(Observer observer){
observers.remove(observer);
}
//抽象通知方法
public abstract void notify();
}
1
2
3
4
5
6
7
8
//具体目标
public class ConcreteSubject extends Subject{
public void notify(){
for (Object obj : observers){
((Observer)obj).update();
}
}
}
1
2
3
4
//观察者
interface Observer{
public void update(); //声明观察者响应的方法
}
1
2
3
4
5
6
//具体观察者
public class ConcreteObserver extends Observer{
public void update(){
//具体观察者响应的代码
}
}

状态模式(state pattern)

策略模式(strategy pattern)

模板方法模式(templeate method pattern)

访问者模式(visitor pattern)